//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//import com.gzredsoft.mvc.view.entity.TNodeAttr;
//import com.gzredsoft.mvc.view.entity.TNodeFilter;
//import com.gzredsoft.mvc.view.entity.TNodeFilterDetail;
//import com.gzredsoft.mvc.view.entity.TPlanChart;
//import com.gzredsoft.mvc.view.entity.TPlanLine;
//import com.gzredsoft.mvc.view.entity.TPlanNode;
//import com.gzredsoft.tool.Constant;
//
//public class BuildDbSql {
//
//	private int tableAliasCnt = 0;
//	private  Map<String,TPlanNode> nodeMap = new HashMap<>();
//
//
//	public String buildSql(TPlanChart chart,String lastNodeId) {
//		List<TPlanLine> lineList = (List<TPlanLine>)chart.get("line");
//		List<TPlanNode> nodeList = (List<TPlanNode>)chart.get("node");
//		//初始化所有node
//		for (TPlanNode node : nodeList) {
//			nodeMap.put(node.getNodeId(), node);
//			node.set("alias", getTableAlias());
//		}
//		if(nodeMap.get(lastNodeId) == null) {
//			return "";
//		}
//		//初始化二叉树
//		BinaryTree tree = initTree(lastNodeId, lineList);
//		//后序扫描二叉树，生成sql,最终sql保存在root节点上。
//		postOrder(tree.getRoot());
//
//		return tree.getRoot().getData().get("sql").toString();
//	}
//
//	//初始化二叉树
//	private BinaryTree initTree(String lastNodeId,List<TPlanLine> lineList) {
//
//		TPlanNode rootNode = nodeMap.get(lastNodeId);
//		BinaryTreeNode root = new BinaryTreeNode(rootNode);
//		BinaryTree bt = new BinaryTree(lastNodeId,root);
//
//		for (TPlanLine line : lineList) {
//			String nodeId = line.getTargetId();
//			BinaryTreeNode node =  bt.getNode(nodeId);
//			if(node == null) {
//				node = new BinaryTreeNode();
//				node.setData(nodeMap.get(nodeId));
//				bt.addNode(nodeId, node);
//			}
//			String childNodeId = line.getSourceId();
//			BinaryTreeNode childNode =  bt.getNode(childNodeId);
//			if(childNode == null) {
//				childNode = new BinaryTreeNode();
//				childNode.setData(nodeMap.get(childNodeId));
//				bt.addNode(childNodeId, childNode);
//			}
//			if(node.getLchild() == null) {
//				node.setLchild(childNode);
//			}else {
//				node.setRchild(childNode);
//			}
//		}
//
//		return bt;
//	}
//
//
//	//递归实现后序遍历 LNR
//    public void postOrder(BinaryTreeNode node){
//        if(node == null){
//        		return;
//        }
//        postOrder(node.getLchild());
//        postOrder(node.getRchild());
//        System.out.print(node.getData().getNodeId() + " ");
//        String nodeType = node.getData().getNodeType();
//		//输入组件组成（表名+输出字段）
//		if(Constant.NODE_TYPE_INPUT.equals(nodeType)) {
//			inputNode(node.getData());
//		}
//		//条件组件组成（多子条件合成，子条件结构:字段+操作符+值）
//		else if(Constant.NODE_TYPE_FILTER.equals(nodeType)) {
//			filterNode(node.getData());
//			String leftSql = node.getLchild().getData().get("sql").toString();
//			String nodeSql = node.getData().get("sql").toString();
//			node.getData().set("sql",leftSql+" where "+nodeSql);
//		}
//		//交集
//		else if(Constant.NODE_TYPE_CROSS.equals(nodeType)) {
//			crossNode(node.getData());
//			String leftSql = node.getLchild().getData().get("sql").toString();
//			leftSql = "("+leftSql+") "+node.getLchild().getData().get("alias");
//			String rightSql = node.getRchild().getData().get("sql").toString();
//			rightSql = "("+rightSql+") "+node.getRchild().getData().get("alias");
//			String nodeSql = node.getData().get("sql").toString();
//			node.getData().set("sql",nodeSql.replace("#node_l#", leftSql).replace("#node_r#", rightSql));
//		}
//
//    }
//
//    /**
//     * 输入组件生成sql
//     * @param node
//     */
//	private void inputNode (TPlanNode node) {
//		List<TNodeAttr> attrList = (List<TNodeAttr>)node.get("node_attr");
//		StringBuffer showField = new StringBuffer();
//		StringBuffer sql = new StringBuffer();
//		sql.append("select ");
//		for (TNodeAttr nodeAttr : attrList) {
//			//1.输出字段
//			if(Constant.ATTR_SHOW_FIELD_COLUMN_NAME.equals(nodeAttr.getAttrName())) {
//				showField.append(nodeAttr.getAttrValue());
//				showField.append(",");
//			}
//			//2.来源表
//			if(Constant.ATTR_IN_SOURCE_NAME.equals(nodeAttr.getAttrName())) {
//				node.set("source", nodeAttr.getAttrValue());
//			}
//		}
//		node.set("showField", showField.toString());
//		sql.append(showField.length()==0?" * ":showField.substring(0,showField.length()-1));
//		sql.append(" from ");
//		sql.append(node.get("source"));
//		node.set("sql", sql.toString());
////		System.out.println(sql.toString());
//	}
//
//	/**
//     * 过滤组件生成sql
//     * @param node
//     */
//	private void filterNode (TPlanNode node) {
//		List<TNodeFilter> filterList = (List<TNodeFilter>)node.get("node_filter");
//		node.set("sql", conditionIteration(null,filterList,1,1));
//		System.out.println(node.get("sql"));
//	}
//	/**
//	 * 交集处理
//	 * @param node
//	 */
//	private void crossNode (TPlanNode node) {
//		List<TNodeAttr> attrList = (List<TNodeAttr>)node.get("node_attr");
//		node.set("sql", " select #fields# from  #node_l# , #node_r#  #condition# " );
//		StringBuffer showField = new StringBuffer();
//		StringBuffer condition = new StringBuffer();
//		StringBuffer conditionLeft = new StringBuffer();
//		StringBuffer conditionRight = new StringBuffer();
//		String operator = "";
//		String leftNodeId = "";
//		String rightNodeId = "";
//		for (TNodeAttr nodeAttr : attrList) {
//			if(Constant.AS_RELATION_L_NODE_ID.equals(nodeAttr.getAttrName())) {
//				leftNodeId = nodeAttr.getAttrValue();
//				node.set("node_l",leftNodeId);
//			}
//			if(Constant.AS_RELATION_R_NODE_ID.equals(nodeAttr.getAttrName())) {
//				rightNodeId = nodeAttr.getAttrValue();
//				node.set("node_r",rightNodeId);
//			}
//		}
//		//输出字段
//		int group = 0;
//		boolean flag = false;
//		String name = "";
//		String alias = "";
//		String nodeId = "";
//		String nodeAlias = "";
//		for (TNodeAttr nodeAttr : attrList) {
//			if(group == Integer.parseInt(nodeAttr.getAttrGroup()) ) {
//				if(Constant.ATTR_SHOW_FIELD_COLUMN_NAME.equals(nodeAttr.getAttrName())) {
//					nodeAlias = nodeMap.get(nodeId).get("alias")+".";
//					flag = true;
//					name = nodeAttr.getAttrValue();
//				}
//				if(Constant.ATTR_SHOW_FIELD_COLUMN_ALIAS.equals(nodeAttr.getAttrName())) {
//					alias = " "+nodeAttr.getAttrValue();
//				}
//				if(Constant.ATTR_SHOW_FIELD_COLUMN_NODE_ID.equals(nodeAttr.getAttrName())) {
//					nodeId = nodeAttr.getAttrValue();
//				}
//			}else {
//				group++;
//				if(flag) {
//					showField.append(nodeAlias);
//					showField.append(name);
//					showField.append(alias);
//					showField.append(",");
//					flag = false;
//				}
//			}
//		}
//		showField.append(nodeAlias);
//		showField.append(name);
//		showField.append(alias);
//
//		node.set("sql", node.get("sql").toString().replace("#fields#",showField.length()==0?" * ":showField));
//
//		//关联条件
//		group = 0;
//		flag = false;
//		for (TNodeAttr nodeAttr : attrList) {
//			if(group == Integer.parseInt(nodeAttr.getAttrGroup()) ) {
//				//1.关系操作
//				if(Constant.AS_RELATION_L_COLUMN_NAME.equals(nodeAttr.getAttrName())) {
//					conditionLeft = new StringBuffer();
//					conditionLeft.append(nodeMap.get(leftNodeId).get("alias"));
//					conditionLeft.append(".");
//					conditionLeft.append(nodeAttr.getAttrValue());
//					flag = true;
//				}
//				if(Constant.AS_RELATION_OPERATOR.equals(nodeAttr.getAttrName())) {
//					condition = new StringBuffer();
//					operator = nodeAttr.getAttrValue();
//				}
//				if(Constant.AS_RELATION_R_COLUMN_NAME.equals(nodeAttr.getAttrName())) {
//					conditionRight = new StringBuffer();
//					conditionRight.append(nodeMap.get(rightNodeId).get("alias"));
//					conditionRight.append(".");
//					conditionRight.append(nodeAttr.getAttrValue());
//				}
//			} else {
//				group++;
//				if(flag) {
//					condition.append(conditionLeft);
//					condition.append(" ");
//					condition.append(operator);
//					condition.append(" ");
//					condition.append(conditionRight);
//					condition.append(" and ");
//					flag = false;
//				}
//			}
//		}
//		condition.append(conditionLeft);
//		condition.append(" ");
//		condition.append(operator);
//		condition.append(" ");
//		condition.append(conditionRight);
//
//		node.set("sql", node.get("sql").toString().replace("#condition#",condition.length()==0?"":" where "+condition));
//		System.out.println(node.get("sql"));
//	}
//
//	/**
//	 * 生成节点别名
//	 * @return
//	 */
//	private String getTableAlias() {
//		char c = 'a';
//		c += tableAliasCnt;
//		tableAliasCnt++;
//		return String.valueOf(c);
//	}
//
//	/**
//	 * 查询条件递归
//	 * @return
//	 */
//	private String conditionIteration(String parentId,List<TNodeFilter> filterList,int depth,int orderId) {
//		StringBuffer rs = new StringBuffer();
//		rs.append("(");
//		for (int j = orderId-1; j < filterList.size(); j++) {
//			TNodeFilter nodeFilter = filterList.get(j);
//			if(parentId!=null && !parentId.equals(nodeFilter.getParentId())) {
//				continue;
//			}
//			if(depth == Integer.parseInt(nodeFilter.getDepth())) {
//				if("1".equals(nodeFilter.getIsLeaf())) {
//					TNodeFilterDetail detail = (TNodeFilterDetail)nodeFilter.get("detail");
//					String conStr = genCondition(detail.getColumnName(),detail.getColumnType(),detail.getOperator(),detail.getValue(),detail.getValue2());
////					System.out.println("conStr:"+conStr);
//					rs.append(conStr)	;
//				}
//				else {
//					String str= conditionIteration(nodeFilter.getFilterId(),filterList,depth+1,1);
//					rs.append(str)	;
//				}
//				rs.append(" ")	;
//				rs.append(nodeFilter.getRelation())	;
//				rs.append(" ")	;
//				orderId ++;
//			} else {
//				break;
//			}
//		}
//		rs.append(")");
//
//		return rs.toString();
//	}
//
//	private String genCondition(String field ,String fieldType , String operator,String value,String value2) {
//
//		return DbQuery.getInstance().buildCondition(field,fieldType, operator, value,value2);
//	}
//
//}
